// #include "../func.hpp"
// #include <signal.h>
// // int cnt = 0;

// // void handler(int signo){
// //     cout << "catch a signal: " << signo << endl;
// //     // cout << cnt << endl;
// //     // exit(0);
// //     // exit(0);
// // }

// int main(){
//     // signal(11,handler);
//     int id= fork();
//     if (id == 0){
//         int* a = nullptr;
//         *a = 10;
//     }
//     else {
//         int status = 0;
//         pid_t child = waitpid(id,&status,0);
//         if (child > 0){
//             printf("wait %d success, status:%d, errorcode:%d, iscore?: %d\n",child,(status>>8)&0xFF,status&0x7F,(status>>7)&1);
//         }
//     }
//     return 0;
// }

// int main(){
//     // alarm(0);
//     // handler(13);
//     // cout.sync_with_stdio(false);
//     // cout.tie(nullptr);
//     // cin.tie(nullptr);
//     signal(14,handler);
//     alarm(1); //ber是这个alarm竟然是在代码写完之后就直接发送信号了? 那是怎么做到延迟n秒触发?
//     while(true){
//         cnt++;
//         cout << "hello world" << endl;
//         // sleep(1);
//     }
// }
// #include <functional>
// #include <vector>
// using func_t = std::function<void()>;
// std::vector<func_t> tasks;

// void Handler(int signo)
// {
//     for (auto& t : tasks){
//         t();
//     }
//     alarm(1);
// }

// int main()
// {
//     signal(14,Handler);
//     tasks.push_back([](){ std::cout << "我是一个下载任务" << std::endl;});
//     tasks.push_back([](){ std::cout << "我是一个网络连接任务" << std::endl;});
//     tasks.push_back([](){ std::cout << "我是一个数据处理任务" << std::endl;});

//     alarm(1);
//     while(true){
//         pause(); //等待一个信号，如果没有就阻塞住
//         std::cout << "开始执行指定的任务" << std::endl;
//     }

//     return 0;
// }

#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <string>
using namespace std;
// int cnt = 0;
#include <sys/wait.h>
#include <functional>
#include <vector>
using func_t = std::function<void()>;
std::vector<func_t> tasks;

int flg = 0;
void DebugPrintPending(const sigset_t &sig)
{
    std::cout << "pending: [";
    for (int i = 1; i < 32; i++)
    {
        if (sigismember(&sig, i))
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << "]" << std::endl;
}
void DebugPrintBlock()
{
    sigset_t rblock,oblock;
    sigemptyset(&rblock);

    sigprocmask(SIG_BLOCK,&rblock,&oblock);
    std::cout << "Block: ";
    for (int i = 31; i > 0; i--){
        if (sigismember(&oblock,i)){
            std::cout << 1;
        }
        else {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}
void Handler(int signo)
{
    std::cout << "get a signal, signal number is: " << signo << std::endl;
    sigset_t pending;
    sigpending(&pending);
    DebugPrintPending(pending);
    if (signo == 14){
        sigset_t block;
        sigemptyset(&block);
        sigprocmask(SIG_SETMASK,&block,nullptr);
        DebugPrintBlock();
    }
}

int main()
{
    signal(2,Handler);
    signal(14,Handler);

    sigset_t rblock,oblock;
    sigemptyset(&rblock);
    sigaddset(&rblock,2); //把2号新号阻塞住
    sigprocmask(SIG_SETMASK,&rblock,&oblock);
    int cnt = 10;
    while (true)
    {
        DebugPrintBlock();                
        sleep(1);
        if (--cnt == 0){
            sigset_t block;
            sigemptyset(&block);
            sigprocmask(SIG_SETMASK,&block,nullptr);
            DebugPrintBlock();
        }

    }
    return 0;
}